Mean Encoding
** Encoding(평균코딩)은 범주형 변수(Categorical Variable)를 수치형 변수로 변환하는 고 인코딩 기법 중로, 주로 지도 학습**(Supervised Learning)에서 회귀 또는 분류 문제에 활용됩니다. 이 방법은 범주형 변수의 각 범주(Category)를 그 범주에 해당하는 타겟 변수(Target Variable)의 평균값으로 대체하는 방식으로 작동합니다. Mean Encoding은 특히 고유한 카테고리가 많은 변수(예: 도시명, 제품 코드 등)에서 효과적으로 정보를 압축하고 모델 성능을 향상시킬 수 있습니다.
개요
범주형 변수는 머신러닝 모델이 직접 처리할 수 없기 때문에 인코딩을 통해 수치형으로 변환해야 합니다. 일반적인 방법으로는 원-핫 인코딩(One-Hot Encoding), 레이블 인코딩(Label Encoding) 등이 있지만, 카테고리 수가 많을 경우 차원 증가 또는 정보 손실 문제가 발생할 수 있습니다. Mean Encoding은 이러한 한계를 보완하기 위해 제안된 기법으로, 타겟 변수와의 관계를 반영한 인코딩을 가능하게 합니다.
예를 들어, "도시"라는 범주형 변수가 있고, 타겟이 "매출액"이라면, 각 도시별 평균 매출액을 해당 도시의 수치로 대체하게 됩니다. 이는 모델이 범주와 타겟 간의 관계를 학습하는 데 유리하게 작용합니다.
작동 원리
Mean Encoding은 다음 단계로 수행됩니다:
- 데이터 분할: 훈련 데이터를 기반으로 인코딩을 수행합니다. 일반적으로 과적합을 방지하기 위해 교차 검증(CV) 기반 인코딩 또는 폴드별 인코딩을 사용합니다.
- 타겟 평균 계산: 각 범주에 속한 샘플들의 타겟 변수 값의 평균을 계산합니다.
- 변환 적용: 범주형 값을 해당 평균값으로 대체합니다.
수식 표현
범주 ( c )에 대해 Mean Encoding 값은 다음과 같이 정의됩니다:
[ \text{MeanEncoding}(c) = \frac{\sum_{i \in C_c} y_i}{|C_c|} ]
여기서: - ( C_c ): 범주 ( c )에 속한 샘플의 집합 - ( y_i ): 샘플 ( i )의 타겟 값 - ( |C_c| ): 범주 ( c )에 속한 샘플 수
점과 단점
✅ 장점
- 정보 효율성: 범주와 타겟 간의 관계를 직접 반영하므로 모델이 학습하기 쉬운 형태의 피처를 제공합니다.
- 차원 축소: 원-핫 인코딩처럼 차원이 급격히 증가하지 않아 메모리 사용이 효율적입니다.
- 고유 카테고리 많은 변수에 적합: 예: 사용자 ID, 지역 코드 등에서 유용하게 사용됩니다.
❌ 단점
- 과적합 위험: 훈련 데이터에만 존재하는 편향된 평균을 사용하면 테스트 데이터에서 성능 저하가 발생할 수 있습니다.
- 데이터 누수(Data Leakage): 전체 훈련 데이터의 평균을 사용하면 타겟 정보가 인코딩 과정에 직접 노출되어 과적합의 원인이 됩니다.
- 희소 범주 문제: 범주 내 샘플 수가 매우 적을 경우 평균이 불안정해질 수 있습니다.
과적합 방지를 위한 기법
Mean Encoding은 과적합에 취약하므로, 이를 완화하기 위한 여러 전략이 존재합니다.
1. K-Fold 평균 인코딩
훈련 데이터를 K개의 폴드로 나누고, 각 폴드에서 다른 폴드의 데이터를 사용해 평균을 계산합니다. 이렇게 하면 동일한 데이터에서 타겟 정보를 반복 사용하는 것을 방지할 수 있습니다.
from sklearn.model_selection import KFold
import pandas as pd
import numpy as np
def kfold_mean_encoding(train_df, test_df, cat_cols, target_col, n_splits=5):
kf = KFold(n_splits=n_splits, shuffle=True, random_state=42)
train_encoded = train_df.copy()
test_encoded = test_df.copy()
for col in cat_cols:
# 테스트 데이터: 전체 훈련 데이터 기준 평균
global_mean = train_df[target_col].mean()
temp_encoded = train_df.groupby(col)[target_col].mean()
test_encoded[col + '_mean'] = test_df[col].map(temp_encoded).fillna(global_mean)
# 훈련 데이터: K-Fold 방식으로 누수 방지
train_encoded[col + '_mean'] = 0
for train_idx, val_idx in kf.split(train_df):
X_tr, X_val = train_df.iloc[train_idx], train_df.iloc[val_idx]
temp_map = X_tr.groupby(col)[target_col].mean()
train_encoded.loc[val_idx, col + '_mean'] = X_val[col].map(temp_map).fillna(global_mean)
return train_encoded, test_encoded
2. Smoothing (스무딩)
희소 범주에 대해 평균이 불안정해지는 문제를 해결하기 위해 전체 평균을 가중 평균으로 포함시킵니다.
[ \text{SmoothedMean}(c) = \frac{(\text{count}(c) \times \text{mean}(c)) + (\text{global_mean} \times m)}{\text{count}(c) + m} ]
- ( m ): 스무딩 강도 (하이퍼파라미터, 일반적으로 50~100 사용)
이 방식은 샘플 수가 적은 범주는 전체 평균에 가깝게 조정되어 안정성을 높입니다.
활용 사례
- 이커머스: 제품 카테고리별 평균 구매 확률 인코딩
- 금융: 고객 지역별 대출 상환률 인코딩
- 광고 추천: 사용자 클릭률 기반 지역 인코딩
관련 인코딩 기법
기법 | 설명 | 비고 |
---|---|---|
Target Encoding | Mean Encoding의 일반화된 형태로, 회귀에서는 평균, 분류에서는 확률 사용 | Mean Encoding과 동의어로 사용됨 |
Leave-One-Out Encoding | 각 샘플을 제외한 나머지 데이터로 평균 계산 | 누수 최소화 |
Weight of Evidence Encoding | 범주별 로그 오즈비 사용 | 이진 분류에 특화 |
CatBoost Encoding | CatBoost에서 제안된 동적 인코딩 방식 | 내부적으로 과적합 방지 기능 포함 |
참고 자료
- Micci-Barreca, D. (2001). A Preprocessing Scheme for High-Cardinality Categorical Attributes in Classification and Prediction Problems. ACM SIGKDD Explorations.
- Scikit-learn-contrib/category_encoders
- CatBoost Documentation - Categorical Feature Handling
Mean Encoding은 적절한 정규화와 교차 검증을 통해 강력한 피처 엔지니어링 도구가 될 수 있으며, 특히 고차원 범주형 데이터를 다룰 때 매우 유용합니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.